package slxy.jiangtao.dts.core.common.service;

import slxy.jiangtao.dts.core.common.bean.FormCriteria;
import slxy.jiangtao.dts.core.common.bean.FormQuery;
import slxy.jiangtao.dts.core.common.hibernate.qbc.CriteriaQuery;
import slxy.jiangtao.dts.core.common.hibernate.qbc.Page;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface CommonService {
    /**
     * 托管实体
     *
     * @param entity
     * @param <T>
     * @return
     */
     <T> void evict(T entity);

    /**
     * 保存实体
     *
     * @param entity
     * @param <T>
     * @return
     */
    <T> Serializable save(T entity);

    /**
     * 保存实体
     *
     * @param entity
     * @param callback
     * @param <T>
     * @return
     */
    <T> Serializable save(T entity, Runnable callback);

    /**
     * 保存或更新实体
     *
     * @param entity
     * @param <T>
     */
    <T> void saveOrUpdate(T entity);

    /**
     * 删除实体
     *
     * @param entity
     * @param <T>
     */
    <T> void delete(T entity);

    /**
     * 批量保存实体
     *
     * @param entities
     * @param <T>
     */
    <T> void batchSave(List<T> entities);

    /**
     * 批量保存实体
     *
     * @param entities
     * @param callback
     * @param <T>
     */
    <T> void batchSave(List<T> entities, Runnable callback);

    /**
     * 根据实体名称和主键获取实体
     *
     * @param class1
     * @param id
     * @param <T>
     * @return
     */
    <T> T get(Class<T> class1, Serializable id);

    /**
     * 根据实体名称和主键获取实体
     *
     * @param <T>
     * @param entityName
     * @param id
     * @return
     */
    <T> T getEntity(Class entityName, Serializable id);

    /**
     * 根据实体名称和字段名称和字段值获取唯一记录
     *
     * @param <T>
     * @param entityClass
     * @param propertyName
     * @param value
     * @return
     */
    <T> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value);

    /**
     * 按属性查找对象列表.
     */
    <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);

    /**
     * 加载全部实体
     *
     * @param <T>
     * @param entityClass
     * @return
     */
    <T> List<T> loadAll(final Class<T> entityClass);

    /**
     * 删除实体主键删除
     *
     * @param entityName
     * @param id
     * @param <T>
     */
    <T> void deleteEntityById(Class entityName, Serializable id);

    /**
     * 删除实体集合
     *
     * @param <T>
     * @param entities
     */
    <T> void deleteAllEntitie(Collection<T> entities);

    /**
     * 更新指定的实体
     *
     * @param <T>
     * @param pojo
     */
    <T> void updateEntity(T pojo);

    /**
     * 通过hql 查询语句查找对象
     *
     * @param <T>
     * @param hql
     * @return
     */
    <T> List<T> findByQueryString(String hql);

    /**
     * 根据sql更新
     *
     * @param sql
     * @return
     */
    int updateBySqlString(String sql);

    /**
     * 根据sql查找List
     *
     * @param <T>
     * @param query
     * @return
     */
    <T> List<T> findListbySql(String query);

    /**
     * 通过属性称获取实体带排序
     *
     * @param entityClass
     * @param propertyName
     * @param value
     * @param isAsc
     * @param <T>
     * @return
     */
    <T> List<T> findByPropertyisOrder(
            Class<T> entityClass, String propertyName, Object value, boolean isAsc);

    /**
     * 获取列表
     *
     * @param clas
     * @param <T>
     * @return
     */
    <T> List<T> getList(Class clas);

    /**
     * & 获取唯一实体
     *
     * @param hql
     * @param <T>
     * @return
     */
    <T> T singleResult(String hql);

    /**
     * 获取Session
     *
     * @return
     */
    Session getSession();

    List findByExample(final String entityName, final Object exampleEntity);

    /**
     * 通过cq获取全部实体
     *
     * @param <T>
     * @param cq
     * @return
     */
    <T> List<T> getListByCriteriaQuery(final CriteriaQuery cq, Boolean ispage);

    /**
     * 通过cq获取全部实体，不分页
     *
     * @param <T>
     * @param cq
     * @return
     */
    <T> List<T> getListByCriteriaQuery(final CriteriaQuery cq);

    /**
     * 执行SQL
     *
     * @param sql
     * @param param
     * @return
     */
    Integer executeSql(String sql, List<Object> param);

    /**
     * 执行SQL
     *
     * @param sql
     * @param param
     * @return
     */
    Integer executeSql(String sql, Object... param);

    /**
     * 执行SQL 使用:name占位符
     *
     * @param sql
     * @param param
     * @return
     */
    Integer executeSql(String sql, Map<String, Object> param);

    /**
     * 执行SQL 使用:name占位符,并返回执行后的主键值
     *
     * @param sql
     * @param param
     * @return
     */
    Object executeSqlReturnKey(String sql, Map<String, Object> param);

    /**
     * 通过hql 查询语句查找对象
     *
     * @param <T>
     * @param hql
     * @param param
     * @return
     */
    <T> List<T> findHql(String hql, Object... param);

    <T> List<T> pageList(DetachedCriteria dc, int firstResult, int maxResult);

    <T> List<T> findByDetached(DetachedCriteria dc);

    /**
     * 执行存储过程
     *
     * @param procedureSql
     * @param params
     * @return
     */
    <T> List<T> executeProcedure(String procedureSql, Object... params);

    /**
     * 分页查询
     *
     * @param cq
     * @param <T>
     * @return
     */
    <T> Page getPage(final CriteriaQuery cq);

    /**
     * 分页查询，可控制分页
     *
     * @param cq
     * @param needPage
     * @param <T>
     * @return
     */
    <T> Page getPage(final CriteriaQuery cq, Boolean needPage);

    /**
     * 表单分页查询
     *
     * @param formQuery
     * @param entityClass
     * @return
     */
    Page getPage(FormQuery formQuery, Class entityClass);

    /**
     * 表单分页查询
     *
     * @param formQuery
     * @return
     */
    Page getPage(FormQuery formQuery);

    /**
     * 表单分页查询, 可用于获取导出数据
     *
     * @param formQuery
     * @param entityClass
     * @param needPage
     * @return
     */
    Page getPage(FormQuery formQuery, Class entityClass, Boolean needPage);


    /**
     * 使用本地SQL查询，不作实体关联
     *
     * @param entityClass
     * @param currPage
     * @param pageSize
     * @param where
     * @return
     */
    Page getPageByNativeSQL(Class entityClass, int currPage, int pageSize, String where);

    /***
     * 使用本地SQL查询，不作实体关联
     * @param entityClass
     * @param currPage
     * @param pageSize
     * @param formCriterias
     * @param delFlag 数据状态，null 查询全部
     * @return
     */
    Page getPageByNativeSQL(Class entityClass, int currPage, int pageSize, List<FormCriteria> formCriterias, Object delFlag);

    /**
     * 根据sql查找List，结果为List<Map>
     *
     * @param <T>
     * @param query
     * @return
     */
    <T> List<T> findListMapBySql(String query);

    String getDictCommon(List<Map<String, String>> list);

    List getMetaKeyValueList(Map<String, String> kv);

    Long getCountForJdbc(String sql);

    Long getCountForJdbcParam(String sql, Object[] objs);
}
